人生苦短,我用Python!

“Life is short, you need Python!”

image.png

1. 为什么学编程

image.png

2.为什么学Python

image.png

image.png

image.png

In [ ]:
 

3.Python语言的特点

image.png

SECTION B

1.Python特性示例展示

输出一行文字

In [ ]:
print('Hello Python!')

一行代码打印乘法口诀

In [ ]:
print('\n'.join([' '.join(["%2s x%2s = %2s"%(j,i,i*j) for j in range(1,i+1)]) for i in range(1,10)]))

一行代码打印迷宫

In [ ]:
print(''.join(__import__('random').choice('\u2571\u2572') for i in range(50*24)))

用Python画画

In [ ]:
import turtle
import time
turtle.pensize(3)
turtle.speed(0)
turtle.bgcolor("black")
colors = ["red","yellow",'purple','blue']
for x in range (400):
    turtle.forward(2*x)
    turtle.color(colors[x % 4])
    turtle.left(92)
turtle.tracer(True)
turtle.done()
In [ ]:
from MyQR import myqr
myqr.run(words='https://haiercell.haierfhtech.com/#/') 
In [ ]:
myqr.run(
    words='https://haiercell.haierfhtech.com/#/',    # 包含信息
    picture='pic/cell.jpg',            # 背景图片
    colorized=True,            # 是否有颜色,如果为False则为黑白
    save_name='qrcode.png'    # 输出文件名
)

2.数据科学领域:

- 科学计算工具 NumPy 和 Pandas

- 机器学习工具 Scikit-learn

- 深度学习工具 TensorFlow 和 Keras

- 自然语言工具 PyTorch

【Pandas】 在数据分析工作中,Pandas 的使用频率是很高的,一方面是因为 Pandas 提供的基础数据结构 DataFrame 与 Json 的契合度很高,转换起来就很方便。另一方面,如果我们日常的数据清理工作不是很复杂的话,你通常用几句 Pandas 代码就可以对数据进行规整。

In [ ]:
import pandas as pd
df = pd.DataFrame(pd.read_excel('doc/运维问题跟踪表.xlsx'))
df

查到今年优先级高的生产环境问题

In [ ]:
high = df.loc[(df['发现日期'] >= '2020-01-01') & (df['重要度'] >= '高')]
high

image.png

保存结果到新的Execl

In [ ]:
high.to_excel('high.xlsx',index = False)

用SQL的方式操作DataFrame

In [ ]:
from pandasql import sqldf
pysqldf = lambda sql: sqldf(sql, globals())
sql = "select 项目名称,count(项目名称) as 数量 from df where 发现日期 >= '2020-01-01' group by 项目名称"
data = pysqldf(sql)
data

【matplotlib 和 seaborn】Python可视化技术

In [ ]:
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['KaiTi']

exploda = (0.1, 0, 0, 0, 0, 0)

plt.pie(data['数量'], labels=data['项目名称'], autopct='%1.1f%%', explode = exploda, shadow = True,startangle=90)

plt.title('系统BUG分布', fontsize=18)
In [ ]:
import seaborn as sns

# 数据准备
iris = sns.load_dataset('iris')

# 用 Seaborn 画成对关系
sns.pairplot(iris)

plt.show()
In [ ]:
# 数据准备
tips = sns.load_dataset("tips")

print(tips.head(10))

# 用 Seaborn 画二元变量分布图(散点图,核密度图,Hexbin 图)
sns.jointplot(x="total_bill", y="tip", data=tips, kind='scatter')
sns.jointplot(x="total_bill", y="tip", data=tips, kind='kde')
sns.jointplot(x="total_bill", y="tip", data=tips, kind='hex')

plt.show()
In [ ]:
from pyecharts import options as opts
from pyecharts.charts import Funnel
from pyecharts.faker import Faker

c = (
    Funnel()
    .add(
        "商品",
        [list(z) for z in zip(Faker.choose(), Faker.values())],
        label_opts=opts.LabelOpts(position="inside"),
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="商品漏斗图"))
    .render("商品漏斗.html")
)
print("已生成")

用腾讯疫情数据 生成 【全国新冠病毒累计确诊实时3D地图】 (70行)

https://news.qq.com/zt2020/page/feiyan.htm#/?nojump=1

In [ ]:
import json
import requests
import pandas as pd
from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType, ChartType

reponse = requests.get('https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5').json()
data = json.loads(reponse['data'])
province = []
confirm = []
for item in data['areaTree'][0]['children']:
    province.append(item['name'])
    confirm.append(item['total']['confirm'])
china_data = pd.DataFrame({"province": province, "confirm": confirm})

dicts_all = {'黑龙江': [127.9688, 45.368], '上海': [121.4648, 31.2891],
             '内蒙古': [110.3467, 41.4899], '吉林': [125.8154, 44.2584],
             '辽宁': [123.1238, 42.1216], '河北': [114.4995, 38.1006],
             '天津': [117.4219, 39.4189], '山西': [112.3352, 37.9413],
             '陕西': [109.1162, 34.2004], '甘肃': [103.5901, 36.3043],
             '宁夏': [106.3586, 38.1775], '青海': [101.4038, 36.8207],
             '新疆': [87.9236, 43.5883], '西藏': [91.11, 29.97],
             '四川': [103.9526, 30.7617], '重庆': [108.384366, 30.439702],
             '山东': [117.1582, 36.8701], '河南': [113.4668, 34.6234],
             '江苏': [118.8062, 31.9208], '安徽': [117.29, 32.0581],
             '湖北': [114.3896, 30.6628], '浙江': [119.5313, 29.8773],
             '福建': [119.4543, 25.9222], '江西': [116.0046, 28.6633],
             '湖南': [113.0823, 28.2568], '贵州': [106.6992, 26.7682],
             '广西': [108.479, 23.1152], '海南': [110.3893, 19.8516],
             '广东': [113.28064, 23.125177], '北京': [116.405289, 39.904987],
             '云南': [102.71225, 25.040609], '香港': [114.165460, 22.275340],
             '澳门': [113.549130, 22.198750], '台湾': [121.5200760, 25.0307240]}
for item in [list(z) for z in zip(china_data['province'], china_data['confirm'])]:
    dicts_all[item[0]].append(item[1])

(Map3D()
 .add_schema(
    itemstyle_opts=opts.ItemStyleOpts(
        color="rgb(5,101,123)",
        opacity=1,
        border_width=0.8,
        border_color="rgb(62,215,213)"),
    map3d_label=opts.Map3DLabelOpts(
        is_show=False,
        formatter=JsCode(
            "function(data){return data.name + " " + data.value[2];}")),
    emphasis_label_opts=opts.LabelOpts(
        is_show=False,
        color="#fff",
        font_size=10,
        background_color="rgba(0,23,11,0)"),
    light_opts=opts.Map3DLightOpts(
        main_color="#fff",
        main_intensity=1.2,
        main_shadow_quality="high",
        is_main_shadow=False,
        main_beta=10,
        ambient_intensity=0.3))
 .add(
    series_name="bar3D",
    data_pair=list(zip(list(dicts_all.keys()), list(dicts_all.values()))),
    type_=ChartType.BAR3D,
    bar_size=1,
    shading="lambert",
    label_opts=opts.LabelOpts(
        is_show=True,
        formatter=JsCode(
            "function(data){return data.name + ' ' + data.value[2];}")))
 .set_global_opts(title_opts=opts.TitleOpts(title="COVID-全国疫情分布图"))).render("全国疫情分布图.html")

三国演义 生成 词云

In [ ]:
import jieba
import wordcloud
from imageio import imread

img = imread('doc/sango.png')

def get_text():
    f = open('doc/sango.txt','r',encoding='utf-8').read()
    return ' '.join([i for i in jieba.lcut(f) if len(i)!= 1])

w = wordcloud.WordCloud(font_path=r'C:\WINDOWS\Fonts\msyh.ttc',width=1080,height=768,background_color='white',mask=img)
w.generate(get_text())
w.to_file('wordcloud.jpg')

3.网络爬虫:

1.requests

爬取网站:https://dynamic1.scrape.cuiqingcai.com/
In [ ]:
import requests

INDEX_URL = 'https://dynamic1.scrape.cuiqingcai.com/api/movie/?limit=10&offset=0'

print(requests.get(INDEX_URL).json())

2.Selenium(Pyppeteer)

打卡百度 搜索关键字 "Python"
In [ ]:
from selenium import webdriver
browser = webdriver.Chrome(executable_path='D:\chromedriver.exe')
browser.get("https://www.baidu.com")
inputs = browser.find_element_by_id("kw")
inputs.send_keys("Python")
browser.find_element_by_id("su").click()

Chromium是谷歌为了研发Chrome而启动的项目,是完全开源的。二者基于相同的源代码构建,Chrome所有的新功能都会先在Chromium上实现,待验证稳定后才会移植,因此 Chromium 的版本更新频率更高,也会包含很多新的功能,但作为一款独立的浏览器,Chromium 的用户群体要小众得多。两款浏览器“同根同源”,它们有着同样的 Logo,但配色不同,Chrome 由蓝红绿黄四种颜色组成,而 Chromium 由不同深度的蓝色构成。 image.png Pyppeteer就是依赖于Chromium这个浏览器来运行的。那么有了Pyppeteer之后,我们就可以免去那些烦琐的环境配置等问题。如果第一次运行的时候,Chromium浏览器没有安装,Chromium 浏览器没有安装,那么程序会帮我们自动安装和配置,就免去了烦琐的环境配置等工作。另外 Pyppeteer 是基于 Python 的新特性 async 实现的,所以它的一些执行也支持异步操作,效率相对于 Selenium 来说也提高了。

3.异步爬取演示

对象网站:https://static4.scrape.cuiqingcai.com/detail/1

requests同步方式

In [ ]:
import requests
import time

TOTAL_NUMBER = 5
BASE_URL = 'https://static4.scrape.cuiqingcai.com/detail/{id}'

start_time = time.time()

for id in range(1, TOTAL_NUMBER + 1):
    url = BASE_URL.format(id=id)
    print(f'scraping {url}', )
    response = requests.get(url)
end_time = time.time()

print(f'\ntotal time {round((end_time - start_time),2)} seconds')

aiohttp 异步方式

In [ ]:
import asyncio
import aiohttp
import nest_asyncio


nest_asyncio.apply()
start = time.time()

async def get(url):
    session = aiohttp.ClientSession()
    response = await session.get(url)
    await response.text()
    await session.close()
    return response

async def request(id):
    url = f'https://static4.scrape.cuiqingcai.com/detail/{id}'
    print('Waiting for', url)
    response = await get(url)
    print('Get response from', url, 'response')

tasks = [asyncio.ensure_future(request(i + 1)) for i in range(5)]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

end = time.time()
print(f'\ntotal time {round((end - start),2)} seconds')

500个请求访问[百度]image.png

In [ ]:
def test(number):
    start = time.time()

    async def get(url):
        session = aiohttp.ClientSession()

        response = await session.get(url)
        await response.text()
        await session.close()
        return response

    async def request():
        url = 'http://www.baidu.com'
        await get(url)

    tasks = [asyncio.ensure_future(request()) for _ in range(number)]
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(tasks))

    end = time.time()
    print(f'Number:{number}, Cost time:{round((end - start),2)} seconds')


for number in [10, 50, 75, 100, 200, 500]:
    test(number)

Scrapy框架简介

  • Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛
  • 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便

image.png

4.网络图片爬取

In [ ]:
import requests
dir = 'xqImg/'
url = 'http://www.7799520.com/api/user/pc/list/search?startage=21&endage=30&gender=2&startheight=151&endheight=160&marry=1&salary=3&page='
for i in range(10):
    jsonData = requests.get(url + str(i+1)).json()
    for j in jsonData['data']['list']:
        imgUrl = j['avatar']
        #发送网络请求
        resp = requests.get(imgUrl)
        #创建图片文件,并将流写入图片
        img = open(dir + j['username'] + '.jpg', 'wb')
        img.write(resp.content)
print('爬取完成')

5.图片识别(中、英文、数字)

【PIL】Python Imaging Library

【pytesseract】Google的ocr库

image.png

In [ ]:
from PIL import Image
import pytesseract
# 验证码识别
code = pytesseract.image_to_string(Image.open('pic/code.jpg'), lang='eng')   
code

image.png

In [ ]:
# 中文识别
life = pytesseract.image_to_string(Image.open('pic/人生苦短我用Python.jpg'), lang='chi_sim')   
life

4.测试团队工作中实际运用

  • 接口自动化测试
  • UI自动化测试
  • 数据核对

云悉:接口自动化测试

image.png

解耦专项: DIS与金控数据核对

image.png

玛西普订单日清:每日数据同步

image.png

万链小助手:大屏&日清数据辅助工具

image.png

万链小助手:大屏&日清数据辅助工具

image.png

5.后续计划和展望

  • 脚本工具封装
  • UI&专项测试
  • 测试平台搭建

image.png

6.最后说说Python的缺点。

任何编程语言都有缺点,Python也不例外。优点说过了,那Python有哪些缺点呢?

第一个缺点就是运行速度慢,和C程序相比非常慢,因为Python是解释型语言,你的代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。而C程序是运行前直接编译成CPU能执行的机器码,所以非常快。 image.png

第二个缺点就是代码不能加密。如果要发布你的Python程序,实际上就是发布源代码,这一点跟C语言不同,C语言不用发布源代码,只需要把编译后的机器码发布出去。要从机器码反推出C代码是不可能的,所以,凡是编译型的语言,都没有这个问题,而解释型的语言,则必须把源码发布出去。

这个缺点仅限于你要编写的软件需要卖给别人挣钱的时候。好消息是目前的互联网时代,靠卖软件授权的商业模式越来越少了,靠网站和移动应用卖服务的模式越来越多了,后一种模式不需要把源码给别人。 image.png

Python还有其他若干小缺点,请自行忽略,就不一一列举了。

Python知识图谱

image.png

抽奖彩蛋

image.png

image.png

image.png